// Receiver.cpp: implementation of the Receiver class.
//
//////////////////////////////////////////////////////////////////////

#include "Receiver.h"
#include "Cliente.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
SDL_TimerID Receiver::updater = NULL;
Cliente* Receiver::cliente = NULL;


Receiver::Receiver(CNodeClient& socketCliente, MapObservers& mapObservers,Cliente* cliente)
{
	this->cliente = cliente;
	this->socketCliente = socketCliente;
	this->mapObservers = mapObservers;
	this->setPriority(thread::ALTA);

}

Receiver::~Receiver()
{

}

void Receiver::run() {
	try{
		updater = SDL_AddTimer(50, &update2, NULL);
		while(this->socketCliente.isConnected()){
			int enumerado,length;
			this->socketCliente.getInputStream().read(reinterpret_cast<char*>(&enumerado),sizeof(enumerado));
			this->socketCliente.getInputStream().read(reinterpret_cast<char*>(&length),sizeof(length));
			void* data = operator new(length);
			this->socketCliente.getInputStream().read((char*)data,length);
			MapObservers::iterator it = mapObservers.find(enumerado);
			if(it!=mapObservers.end()){
				//patetico no anda
				(it->second)->notify(data);
			} else {
				//no haces nada porque no tenes handler para el mensaje
				logger::getInstancia()->logCliente("No hay handler para el mensaje");
			}
			delete data;
			//sleep(30);
		}
	} catch(IOException* ex){
		//rompio el socket
		//taria bueno dibujar pantalla de "man, se rompio la conexion"
		logger::getInstancia()->logCliente(ex->what());
		delete ex;
		this->socketCliente.close();
	}


}

Uint32 Receiver::update2(Uint32 intervalo, void * adicional){
	cliente->graficar();
	return intervalo;
}